TypeScript: const assertion (as const)
オブジェクトリテラルの末尾に as const を記述することで、オブジェクトのプロパティ全て readonlyで指定した扱いになる
widening を抑止する
code:ts
const testObj = { name: "aaa", age: 25 }
testObj.name = "hello" # これはコンパイルエラーになる
readonly 機能と as const 機能の違い
readonly は プロパティごとにつけられる
一部だけreadonly にしたい場合はこっちを使う
as const は 再帰的に readonly になる
オブジェクトの中にオブジェクトがある場合、readonly を使うと再帰的には指定できない
as const を使うと再帰的に適用される
配列の値からunion型を生成するときに as const を使う
code:ts
// "a" | "b" | "c"
type Values = typeof arraynumber widening の抑止について
widening とは、型推論を拡大して行うこと
例
code:ts
const age = 18
このとき、age は 18 というリテラル型になるのだが、
code:ts
const myObject = {
age: 18,
name: "鈴木",
};
// 推論結果
// {
// age: number,
// name: string
//}
このときは、推論結果が number と拡大される。
オブジェクトや配列、let の時は widening が行われる
as const を使うと、widening が抑止されて、リテラル型となる
code:ts
export const myObject = {
age: 18,
name: "鈴木",
} as const;
-> age は 18 のリテラル型、name は 鈴木 のリテラル型